#pragma once
#include<fstream>
#include<iostream>
#include<string>
#include<unordered_map>     //在内存中  构建中英文的映射关系
#include"Log.hpp"   
#include"InetAddr.hpp"      //想看到是谁在请求对应的服务

const std::string defaultdict = "./dictionary.txt";
using namespace LogModule;
const std::string sep = ":";   //定义sep分隔符

class Dict
{
    public: 
        Dict(const std::string &path = defaultdict):_dict_path(path)    //这里直接缺省字典path
        {

        }

    //加载字典
        bool LoadDict()
        {
            //首先打开字典(输入流)
            std::ifstream in(_dict_path);
            if(!in.is_open())
            {
                LOG(LogLevel::DEBUG) << "打开字典：" << _dict_path << " 错误！";
                return false;
            }
            std::string line;
            while(std::getline(in,line))   //从指定的文件流中获取，获取到line中，从打开的文件流中按行获取
            {
                //apple: 苹果
                auto pos = line.find(sep);   //找到冒号 :
                if(pos == std::string::npos)
                {
                    LOG(LogLevel::WARNING) << "解析：" << line << " 失败";     //输出一个解析，解析失败。
                    continue;   //一个失败 继续下一个
                }

                //提取英文：从左侧行最开头处提取，查找到分隔符是冒号处，单词长度恰好就是冒号的下标
                std::string english = line.substr(0,pos);   

                //提取汉字：从分隔符开始，pos + 分隔符的大小，默认到读到结尾即可得到汉字
                std::string chinese = line.substr(pos+sep.size());

                if(english.empty() || chinese.empty())
                {
                    LOG(LogLevel::WARNING) << "没有有效内容" << line;
                    continue;
                }
                _dict.insert(std::make_pair(english,chinese));
                LOG(LogLevel::DEBUG) << "加载：" << line;
            }
            //关闭字典（关闭流）
            in.close();
            return true;
        }

    //补上一个client
        std::string Translate(const std::string &word,InetAddr &client)
        {
            auto iter = _dict.find(word);
            if(iter == _dict.end())
            {
            LOG(LogLevel::DEBUG) << "进入到了翻译模块,[" << client.Ip()<< ":" << client.Port() << "]# " << word
            << "->没有找到对应信息";
            return "None";    //没有查到返回 None
            }
            
            LOG(LogLevel::DEBUG) << "进入到了翻译模块,[" << client.Ip()<< ":" << client.Port() << "]# " << word
            << "->" << iter->second ;
            return iter->second;   //找到了返回iter所指向的second，拿到map中的value值，返回值给std::string 
    //之后 UdpServer 就会得到客户端所对应的信息，收到了单词就会进行回调，回到之后就会回调到翻译Translate，然后会进行搜索
    //若没找到直接报错！
        }


        ~Dict()
        {}
    
    
    
    
    
    private:
        std::string _dict_path;     //文件路径+文件名
        std::unordered_map<std::string,std::string> _dict;    //构建map映射

};








